package com.john.http.core.util;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 〈一句话功能简述〉<br/>
 * 〈功能详细描述〉
 *
 * @author jiangguangtao on 2016/4/28.
 */
public class NumUtil {
    private static final Logger log = LoggerFactory.getLogger(NumUtil.class);

    /**
     * 转换成数值
     *
     * @param str
     * @param def
     * @return
     */
    public static Double parseDouble(String str, Double def) {
        if (StringUtils.isBlank(str)) {
            return def;
        }
        try {
            return Double.valueOf(str);
        } catch (NumberFormatException e) {
            log.warn("{} 不是有效的数值", str, e);
            return def;
        }
    }

    /**
     * 解释整数
     *
     * @param str
     * @param def
     * @return
     */
    public static Integer parseInt(String str, Integer def) {
        if (StringUtils.isBlank(str)) {
            return def;
        }
        try {
            return Integer.valueOf(str, 10);
        } catch (NumberFormatException e) {
            log.warn("{} 不是有效的数值", str, e);
            return def;
        }
    }

    /**
     * 使用正则表达式解释文本中的数值（浮点数）部分
     *
     * @param str
     * @param def
     * @return
     */
    public static Double regexParseDouble(String str, Double def) {
        if (StringUtils.isBlank(str)) {
            return def;
        }

        Pattern pattern = Pattern.compile("([1-9]\\d*\\.\\d*|0\\.\\d*[1-9]\\d*)");
        Matcher matcher = pattern.matcher(str);
        if (matcher.find()) {
            return parseDouble(matcher.group(), def);
        } else {
            log.warn("字符串：{} 未包含数值，不能解析。", str);
            return def;
        }
    }
}
